home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / graphics / mpimage / si / saveilbm.c < prev    next >
C/C++ Source or Header  |  1996-12-01  |  6KB  |  202 lines

  1. /* saveilbm.c 04/92  C. Scheppner CBM
  2.  *
  3.  * High-level ILBM save routines
  4.  *
  5.  * 37.10 07/92 - use scr->RastPort.BitMap instead of &scr->BitMap
  6.  *            for future compatibility
  7.  * 39.5 11/92 - raised BODYBUF size from 4096 to 5004 (should allow saving
  8.  *              of bitmaps up to pixel width of 16384)
  9.  */
  10. #define INTUI_V36_NAMES_ONLY
  11.  
  12. #include "iffp/ilbm.h"
  13. #include "iffp/ilbmapp.h"
  14.  
  15. #define CATCOMP_NUMBERS
  16. #include "messages.h"
  17.  
  18. //extern struct Library *GfxBase;
  19.  
  20. #if 0
  21. /* screensave.c
  22.  *
  23.  * Given an ILBMInfo with a  currently available (not in use)
  24.  *   ParseInfo->iff IFFHandle, a screen pointer, filename, and
  25.  *   optional chunklist, will save screen as an ILBM
  26.  * The struct Chunk *chunklist1 and 2 are for chunks you wish written
  27.  * out other than BMHD, CMAP, and CAMG (they will be screened out
  28.  * because they are computed and written separately).
  29.  *
  30.  * Note -  screensave passes NULL for transparent color and mask
  31.  *
  32.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  33.  */
  34. LONG screensave(struct ILBMInfo *ilbm,
  35.             struct Screen *scr,
  36.             struct Chunk *chunklist1, struct Chunk *chunklist2,
  37.             UBYTE *filename)
  38.     {
  39.     extern struct Library *GfxBase;
  40.     Color32 *colortable32;
  41.     UWORD *colortable, count;
  42.     ULONG modeid;
  43.     LONG error;
  44.     int k;
  45.  
  46.     if(GfxBase->lib_Version >= 36)
  47.     modeid=GetVPModeID(&scr->ViewPort);
  48.     else
  49.     modeid = scr->ViewPort.Modes & OLDCAMGMASK;
  50.  
  51.     count = scr->ViewPort.ColorMap->Count;
  52.  
  53.     error = IFFERR_NOMEM;
  54.  
  55.     if(GfxBase->lib_Version >= 39)
  56.     {
  57.         if(colortable32 = (Color32 *)AllocMem(sizeof(Color32) * count, MEMF_CLEAR))
  58.         {
  59.         GetRGB32(scr->ViewPort.ColorMap,0L,count,(ULONG *)colortable32);
  60.             error = saveilbm(ilbm, scr->RastPort.BitMap, modeid,
  61.         scr->Width, scr->Height, scr->Width, scr->Height,
  62.         colortable32, count, 32,
  63.         mskNone, 0,
  64.         chunklist1, chunklist2, filename);
  65.         FreeMem(colortable32,sizeof(Color32) * count);
  66.         }
  67.     }
  68.     else
  69.     {
  70.         if(colortable = (UWORD *)AllocMem(count << 1, MEMF_CLEAR))
  71.         {
  72.         for(k=0; k<count; k++)
  73.         colortable[k]=GetRGB4(scr->ViewPort.ColorMap,k);
  74.  
  75.             error = saveilbm(ilbm, scr->RastPort.BitMap, modeid,
  76.         scr->Width, scr->Height, scr->Width, scr->Height,
  77.         colortable, count, 4,
  78.         mskNone, 0,
  79.         chunklist1, chunklist2, filename);
  80.         FreeMem(colortable,count << 1);
  81.         }
  82.     }
  83.     return(error);
  84.     }
  85. #endif
  86.  
  87. /* saveilbm
  88.  *
  89.  * Given an ILBMInfo with a currently available (not-in-use)
  90.  *   ParseInfo->iff IFFHandle, a BitMap ptr,
  91.  *   modeid, widths/heights, colortable, ncolors, bitspergun,
  92.  *   masking, transparent color, optional chunklists, and filename,
  93.  *   will save the bitmap as an ILBM.
  94.  *
  95.  *  if bitspergun=4,  colortable is words, each with nibbles 0RGB
  96.  *  if bitspergun=8,  colortable is byte guns of RGBRGB etc. (like a CMAP)
  97.  *  if bitspergun=32, colortable is ULONG guns of RGBRGB etc.
  98.  *     Only the high eight bits of each gun will be written to CMAP.
  99.  *     Four bit guns n will be saved as nn
  100.  *
  101.  * The struct Chunk *chunklist is for chunks you wish written
  102.  * other than BMHD, CMAP, and CAMG (they will be screened out)
  103.  * because they are calculated and written separately
  104.  *
  105.  * Returns 0 for success, or an IFFERR
  106.  */
  107. LONG saveilbm(struct ILBMInfo *ilbm,
  108.         struct BitMap *bitmap, ULONG modeid,
  109.         WORD width, WORD height, WORD pagewidth, WORD pageheight,
  110.         APTR colortable, UWORD ncolors, UWORD bitspergun,
  111.         WORD masking, WORD transparentColor,
  112.         struct Chunk *chunklist1, struct Chunk *chunklist2,
  113.         UBYTE *filename)
  114. {
  115. struct IFFHandle *iff;
  116. struct Chunk *chunk;
  117. ULONG chunkID;
  118. UBYTE *bodybuf;
  119. LONG size, error = 0L;
  120. #define BODYBUFSZ    5004
  121.  
  122.     iff = ilbm->ParseInfo.iff;
  123.  
  124.     if(!(modeid & 0xFFFF0000))    modeid &= OLDCAMGMASK;
  125.  
  126.     if(!(bodybuf = AllocMem(BODYBUFSZ,MEMF_PUBLIC)))
  127.     {
  128.     message(SI(MSG_IFFP_NOMEM));
  129.     return(IFFERR_NOMEM);
  130.     }
  131.  
  132.     if(!(error = openifile(&ilbm->ParseInfo, filename, IFFF_WRITE)))
  133.     {
  134.     D(bug("Opened %s for write\n",filename));
  135.  
  136.     error = PushChunk(iff, ID_ILBM, ID_FORM, IFFSIZE_UNKNOWN);
  137.  
  138.     D(bug("After PushChunk FORM ILBM - error = %ld\n", error));
  139.  
  140.         initbmhd(&ilbm->Bmhd, bitmap, masking, cmpByteRun1, transparentColor,
  141.                     width, height, pagewidth, pageheight, modeid);
  142.  
  143.     D(bug("Error before putbmhd = %ld\n",error));
  144.  
  145.     CkErr(putbmhd(iff,&ilbm->Bmhd));    
  146.  
  147.     if(colortable)    CkErr(putcmap(iff,colortable,ncolors,bitspergun));
  148.  
  149.  
  150.     if(ilbm->IFFPFlags & IFFPF_NOMONITOR) modeid &= (~MONITOR_ID_MASK);
  151.     ilbm->camg = modeid;
  152.     D(bug("before putcamg - error = %ld\n",error));
  153.     CkErr(putcamg(iff,&modeid));
  154.  
  155.     D(bug("Past putBMHD, CMAP, CAMG - error = %ld\n",error));
  156.  
  157.     /* Write out chunklists 1 & 2 (if any), except for
  158.      * any BMHD, CMAP, or CAMG (computed/written separately)
  159.      */
  160.     for(chunk = chunklist1; chunk; chunk = chunk->ch_Next)
  161.         {
  162.         D(bug("chunklist1 - have a %.4s\n",&chunk->ch_ID));
  163.         chunkID = chunk->ch_ID;
  164.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  165.         {
  166.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  167.             strlen(chunk->ch_Data) : chunk->ch_Size;
  168.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  169.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  170.         }
  171.         }
  172.  
  173.     for(chunk = chunklist2; chunk; chunk = chunk->ch_Next)
  174.         {
  175.         chunkID = chunk->ch_ID;
  176.         D(bug("chunklist2 - have a %.4s\n",&chunk->ch_ID));
  177.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  178.         {
  179.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  180.             strlen(chunk->ch_Data) : chunk->ch_Size;
  181.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  182.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  183.         }
  184.         }
  185.  
  186.     /* Write out the BODY
  187.      */
  188.     CkErr(putbody(iff, bitmap, NULL, &ilbm->Bmhd, bodybuf, BODYBUFSZ));
  189.  
  190.     D(bug("Past putbody - error = %ld\n",error));
  191.  
  192.  
  193.     CkErr(PopChunk(iff));    /* close out the FORM */
  194.     closeifile(&ilbm->ParseInfo);    /* and the file */
  195.     }
  196.  
  197.     FreeMem(bodybuf,BODYBUFSZ);
  198.  
  199.     return(error);
  200. }
  201.  
  202.